package Lexico;

import java.util.ArrayList;

import Sintactico.SlkConstants;

public class Token {
 // public int m_index;
  public String m_tipo_token;
  public int m_line;
  public Object m_atributos;
  
//La que venia por defecto. La podriamos quitar porque no se usa  
public Token (Object at, int line){
    m_line = line;
    m_atributos=at;
  }

//constructora para un token cualquiera.
public Token (String index, Object at, int line){
    m_tipo_token=index;
    m_line = line;
    m_atributos=at;
  }

/**
 * Transforms the scanner tokens to SLK tokens, using SLKConstants
 * @return the SLK token
 */
public short toSlkToken(){
	short token = 0;
	//System.out.println("-- " + m_atributos +"\t:: "+ m_tipo_token);
	if (m_tipo_token.equals("OP_PUNT")) { 
		token = '^';
	}
	
	if  (m_tipo_token.equals("OP_COMP")) {
		if (((String)m_atributos).equals("<>"))			token = SlkConstants.LESS_GREATER_;
		else if (((String)m_atributos).equals("<="))	token = SlkConstants.LESS_EQUAL_;
		else if (((String)m_atributos).equals(">="))	token = SlkConstants.GREATER_EQUAL_;	
		else if (((String)m_atributos).equals("="))		token = '=';
		else if (((String)m_atributos).equals("<"))		token = '<';
		else if (((String)m_atributos).equals(">"))		token = '>';
	}
	else if (m_tipo_token.equals("PAL_RES")) {
		if (((ArrayList<String>)m_atributos).get(0).equals("PROGRAM")) 		token = SlkConstants.PROGRAM_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("ARRAY")) 	token = SlkConstants.ARRAY_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("BEGIN")) 	token = SlkConstants.BEGIN_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("CONST")) 	token = SlkConstants.CONST_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("DIV")) 	token = SlkConstants.DIV_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("DO")) 		token = SlkConstants.DO_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("END")) 	token = SlkConstants.END_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("CONST")) 	token = SlkConstants.CONST_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("CASE")) 	token = SlkConstants.CASE_;
		//LAS QUE APARECEN COMENTADAS NO ESTAN DEFINIDAS EN LA GRAMATICA. HAY QUE MODIFICAR LA GRAMATICA.
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("MOD")) 	token = SlkConstants.MOD_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("NIL")) 	token = SlkConstants.NIL_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("DOWNTO"))token = SlkConstants.DOWNTO_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("IF")) 		token = SlkConstants.IF_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("ELSE")) 	token = SlkConstants.ELSE_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("THEN")) 	token = SlkConstants.THEN_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("CASE")) 		token = SlkConstants.CASE_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("FILE")) 	token = SlkConstants.FILE_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("FOR")) 	token = SlkConstants.FOR_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("FORWARD"))token = SlkConstants.FORWARD_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("FUNCTION"))token = SlkConstants.FUNCTION_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("GOTO")) 	token = SlkConstants.GOTO_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("IN")) 	token = SlkConstants.IN_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("LABEL")) token = SlkConstants.LABEL_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("NOT")) 	token = SlkConstants.NOT_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("OF")) 		token = SlkConstants.OF_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("PACKED"))token = SlkConstant.PACKED_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("PROCEDURE"))token = SlkConstants.PROCEDURE_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("RECORD"))token = SlkConstants.RECORD_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("REPEAT"))token = SlkConstants.REPEAT_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("SET")) 	token = SlkConstants.SET_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("THEN")) 	token = SlkConstants.THEN_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("TO")) 	token = SlkConstants.TO_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("TYPE")) 	token = SlkConstants.TYPE_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("UNTIL")) token = SlkConstants.UNTIL_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("VAR")) 	token = SlkConstants.VAR_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("WHILE")) 	token = SlkConstants.WHILE_;
		//else if (((ArrayList<Object>)m_atributos).get(0).equals("WITH")) 	token = SlkConstants.WITH_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("REAL")) 	token = SlkConstants.IDENTIFICADOR_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("BOOLEAN"))token = SlkConstants.IDENTIFICADOR_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("INTEGER"))token = SlkConstants.IDENTIFICADOR_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("CHAR")) 	token = SlkConstants.IDENTIFICADOR_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("STRING")) 	token = SlkConstants.IDENTIFICADOR_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("AND")) 	token = SlkConstants.AND_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("OR")) 		token = SlkConstants.OR_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("TRUE")) 	token = SlkConstants.IDENTIFICADOR_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("FALSE")) 	token = SlkConstants.IDENTIFICADOR_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("NEW")) 	token = SlkConstants.NEW_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("DISPOSE")) 	token = SlkConstants.DISPOSE_;
		else if (((ArrayList<Object>)m_atributos).get(0).equals("FORWARD")) 	token = SlkConstants.FORWARD_;
		//TODO poner todas las palabras reservadas
	}
	else if (m_tipo_token.equals("OP_MAT")) {
		if 		(((String)m_atributos).equals("+"))	token = '+';
		else if (((String)m_atributos).equals("-"))	token = '-';
		else if (((String)m_atributos).equals("*"))	token = '*';
		else if (((String)m_atributos).equals("/"))	token = '/';
	}
	else if (m_tipo_token.equals("ABRE_CORCHETE")) token = '[';
	else if (m_tipo_token.equals("CIERRA_CORCHETE")) token = ']';
	else if (m_tipo_token.equals("ABRE_PAREN")) token = '(';
	else if (m_tipo_token.equals("CIERRA_PAREN")) token = ')';
	else if (m_tipo_token.equals("OP_ASIG")) token = SlkConstants.COLON_EQUAL_;
	else if (m_tipo_token.equals("PUNT")) {
		if (((String)m_atributos).equals(";"))	token = ';';
		else if (((String)m_atributos).equals("."))	token = '.';
		else if (((String)m_atributos).equals(":"))	token = ':';
		else if (((String)m_atributos).equals(",")) token = ',';	

	}
	else if (m_tipo_token.equals("OP_LOG")) {
		if (((String)m_atributos).equals("AND"))	token = SlkConstants.AND_;
		else if (((String)m_atributos).equals("OR")) token = SlkConstants.OR_;
	}
	else if (m_tipo_token.equals("CHAR"))			token = SlkConstants.ENTERO_;
	else if (m_tipo_token.equals("INTEGER")) 		token = SlkConstants.ENTERO_;
	else if (m_tipo_token.equals("REAL")) 			token = SlkConstants.ENTERO_;
	else if (m_tipo_token.equals("IDENTIFICADOR")) {
		if (((String)((ArrayList<Object>)m_atributos).get(0)).toUpperCase().equals("BREAK")) {
			token = SlkConstants.BREAK_;
		}
		else token = SlkConstants.IDENTIFICADOR_;
	}
	else if (m_tipo_token.equals("EOF")) 			token = SlkConstants.END_OF_SLK_INPUT_;

	return token;
	}
}

